package com.cloudfun.campusshare.service;

import com.cloudfun.campusshare.common.constant.RoleType;
import com.cloudfun.campusshare.common.model.dto.*;
import com.cloudfun.campusshare.common.model.vo.*;
import com.cloudfun.campusshare.common.response.BaseResult;
import com.cloudfun.campusshare.common.response.PageResult;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * @author linyangping
 * @date 2019/10/21
 */
public interface UserService {

    /**
     * 用户注册，商家、机构
     *
     * @param registerVO
     * @return
     */
    BaseResult<?> register(RegisterVO registerVO);

    /**
     * 注用户注册，客户
     *
     * @param registerVO
     * @param userAuthDTO
     * @return
     */
    String register(RegisterVO registerVO, UserAuthDTO userAuthDTO);

    /**
     * 获取用户信息
     *
     * @param id
     * @return
     */
    BaseResult<?> getUser(String id);

    /**
     * 根据旧密码重置密码
     *
     * @param resetPasswordByPassVO
     * @return
     */
    BaseResult<?> resetPasswordByOldPassword(ResetPasswordByPassVO resetPasswordByPassVO);

    /**
     * 根据验证码重置密码
     *
     * @param resetPasswordByCodeVO
     * @return
     */
    BaseResult<?> resetPasswordByVerifyCode(ResetPasswordByCodeVO resetPasswordByCodeVO);

    /**
     * 修改账户信息
     *
     * @param userInfoModifyVO
     * @return
     */
    BaseResult<?> modify(UserInfoModifyVO userInfoModifyVO);

    /**
     * 附加信息
     *
     * @param additionInfoVO
     * @return
     */
    BaseResult<?> additionInfo(UserAdditionInfoVO additionInfoVO);

    /**
     * 统计
     *
     * @return
     */
    BaseResult<Long> countAll();

    /**
     * 根据角色获取认证过的用户
     *
     * @return
     */
    List<UserSimpleVO> getAuthenticatedSimpleUserByRoleType(RoleType roleType);

    /**
     * 根据角色统计认证过的用户
     *
     * @param roleType
     * @return
     */
    Long countAuthenticatedUserByRoleType(RoleType roleType);

    /**
     * 金融机构查询贷款人详情
     *
     * @param borrowerId
     * @return
     */
    BorrowerDetailVO borrowerDetail(String borrowerId);

    /**
     * 金融机构搜索贷款人
     *
     * @param value
     * @param pageable
     * @return
     */
    PageResult<BorrowerListVO> searchBorrower(String value, Pageable pageable);

    /**
     * 获取历史关联企业列表
     *
     * @param pageable
     * @param keyword
     * @return
     */
    PageResult<BorrowerHistoryListVO> getHistoryBorrowerList(Pageable pageable, String keyword);

    /**
     * 管理员搜索运营型商家
     *
     * @param value
     * @param pageable
     * @return
     */
    PageResult<OMListVO> searchOMs(String value, Pageable pageable);

    /**
     * 管理员搜索运营型商家
     *
     * @param value
     * @param pageable
     * @return
     */
    PageResult<OpMerchantListVO> searchOpMerchants(String value, Pageable pageable);

    /**
     * 管理员搜索金融机构
     *
     * @param keyword
     * @param pageable
     * @return
     */
    PageResult<FIListVO> searchFIs(String keyword, Pageable pageable);

    /**
     * 管理员查询运营型商家详情
     *
     * @param borrowerId
     * @return
     */
    MerchantFIDetailVO omDetail(String borrowerId);

    /**
     * 金融机构导出贷款人
     *
     * @param value
     * @return
     */
    List<BorrowerExportVO> exportBorrower(String value);

    /**
     * 管理员导出运营型商家
     *
     * @param ids
     * @param value
     * @return
     */
    List<OMExportVO> exportOM(List<String> ids, String value);

    /**
     * 导出运营型商家
     *
     * @param ids
     * @param value
     * @return
     */
    List<OpMerchantExportVO> exportOpMerchant(List<String> ids, String value);

    /**
     * 管理员导出平台型型商家
     *
     * @param ids
     * @param value
     * @return
     */
    List<PMExportVO> exportPM(List<String> ids, String value);

    /**
     * 管理员导出金融机构
     *
     * @param ids
     * @param value
     * @return
     */
    List<FIExportVO> exportFI(List<String> ids, String value);

    /**
     * 获取平台型商家列表
     *
     * @param pageable
     * @param keyword
     * @return
     */
    PageResult<PlatEnterpriseListVO> getPlatEnterpriseList(Pageable pageable, String keyword);


    /**
     * 获取平台型企业详情
     *
     * @param borrowerId id
     * @return
     */
    MerchantFIDetailVO getPlatDetail(String borrowerId);

    /**
     * 获取金融机构详情
     *
     * @param id
     * @return
     */
    MerchantFIDetailVO fiDetail(String id);


    /**
     * 金融机构导出历史关联企业列表
     *
     * @param keyword
     * @return
     */
    List<BorrowHistoryExportVO> getBorrowerHistoryExportList(String keyword);


    /**
     * 金融机构获取历史关联企业详情
     *
     * @param borrowerId
     * @return
     */
    BorrowerHistoryDetailVO getBorrowHistoryDetail(String borrowerId);

    /**
     * 激活账号
     *
     * @param accountActivateDTO
     */
    void activate(AccountActivateDTO accountActivateDTO);

    /**
     * 查询客户
     *
     * @param value
     * @param pageable
     * @return
     */
    PageResult<CustomerListVO> searchCustomer(String value, Pageable pageable);

    /**
     * 导出客户
     *
     * @param value
     * @param ids
     * @return
     */
    List<CustomerExportVO> exportCustomer(List<String> ids, String value);

    /**
     * 搜索账号
     *
     * @param pageable
     * @param accountSearchDTO
     * @return
     */
    PageResult<AccountListVO> searchAccount(Pageable pageable, AccountSearchDTO accountSearchDTO);

    /**
     * 创建账号
     *
     * @param createDTO
     */
    BaseResult<?> createAccount(AccountCreateDTO createDTO);

    /**
     * 编辑账号
     *
     * @param modifyDTO
     */
    BaseResult<?> modifyAccount(AccountModifyDTO modifyDTO);

    /**
     * 删除
     *
     * @param id
     * @return
     */
    BaseResult<?> delete(String id);

    /**
     * 启用\禁用
     *
     * @param id
     * @param enable
     * @return
     */
    BaseResult<?> enable(String id, Boolean enable);

    /**
     * 详情
     *
     * @param id
     * @return
     */
    UserDetailVO detail(String id);

    /**
     * 账户简单列表
     *
     * @return
     */
    List<UserSimpleVO> getSimpleList();

    /**
     * 统计客户
     *
     * @return
     */
    Long customerCount();

    /**
     * 经销商添加子商户
     * @param subClientAddVO
     */
    void addSubClient(SubClientAddVO subClientAddVO);

    /**
     * 经销商查询客户列表
     * @param pageable
     * @param keyword
     * @return
     */
    PageResult<SubClientListVO> getSubClientList(Pageable pageable, String keyword);
}
